home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / hypercrd / xcmds / rtf-redr.hqx / RTFToField.c < prev    next >
C/C++ Source or Header  |  1992-12-19  |  3KB  |  147 lines

  1. /*
  2.  * This software is copyright 1992 by Robert Morris.
  3.  * You may freely redistribute this software as shareware
  4.  * if you do so in the same form as you got it. If you find
  5.  * this software useful, please send $12 to:
  6.  *   Robert Morris
  7.  *   P.O. Box 1044
  8.  *   Harvard Square Station
  9.  *   Cambridge, MA 02238
  10.  *   ecognome@aol.com
  11.  * If you incorporate any of this software in any kind of
  12.  * commercial product, please send $2 per copy distributed
  13.  * to the above address.
  14.  */
  15.  
  16. /*
  17.  * RTFToField(rtf-text, cardflag, fieldname)
  18.  */
  19.  
  20. #include <HyperXCmd.h>
  21. #include <stdlib.h>
  22. #include <ctype.h>
  23. #include "SetUpA4.h"
  24. #include <string.h>
  25. #include "lists.h"
  26. #include "rtf.h"
  27.  
  28. XCmdPtr xptr;
  29. void error(char *);
  30. int goterror;
  31. Handle HStr(char *);
  32.  
  33. pascal void
  34. main(paramPtr)
  35. XCmdPtr paramPtr;
  36. {
  37.     int i;
  38.     TEHandle teh;
  39.     char fieldname[256];
  40.     Boolean cardFld;
  41.     TEStyleHandle sh1;
  42.     MyStyleHandle sh;
  43.     Handle txt, txt1;
  44.     struct list flds;
  45.     long start, nstart, txtlen;
  46.     OSErr err;
  47.     
  48.     RememberA0();
  49.     SetUpA4();
  50.     
  51.     xptr = paramPtr;
  52.     goterror = 0;
  53.     teh = 0;
  54.     sh = 0;
  55.     sh1 = 0;
  56.     txt = 0;
  57.     
  58.     if(paramPtr->paramCount != 3){
  59.         error("error : usage RTFToField(rtf-text, cardflag, fieldname)\rCopyright 1992 Robert Morris.");
  60.         goto out;
  61.     }
  62.     
  63.     parsertf(paramPtr->params[0], &sh, &txt);
  64.  
  65.     if(goterror)
  66.         goto out;
  67.     
  68.     if(strcmp(*(paramPtr->params[1]), "false") == 0)
  69.         cardFld = FALSE;
  70.     else
  71.         cardFld = TRUE;
  72.         
  73.     start = 0;
  74.     txtlen = GetHandleSize(txt);
  75.     NewList(paramPtr->params[2], &flds);
  76.     while(ReadListLine(&flds, fieldname) != -1){
  77.         CtoPstr(fieldname);
  78.     
  79.         teh = GetFieldTE(paramPtr, cardFld, 0, 0, (StringPtr)fieldname);
  80.         if(teh == 0 || paramPtr->result != xresSucc){
  81.             error("error : no such field");
  82.             goto out;
  83.         }
  84.         
  85.         sh1 = GetStylHandle(teh);
  86.         if(sh1 == 0){
  87.             error("error : GetStylHandle() failed");
  88.             goto out;
  89.         }
  90.     
  91.         nstart = start;
  92.         err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
  93.         if(err != 0){
  94.             error("error : out of memory");
  95.             goto out;
  96.         }
  97.  
  98.         /* TESetText() destroys existing style information */
  99.         HLock(txt);
  100.         TESetText(*txt + start, nstart - start, teh);
  101.         HUnlock(txt);
  102.         
  103.         /* so re-compute styles! */
  104.         nstart = start;
  105.         err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
  106.  
  107.         SetFieldTE(paramPtr, cardFld, 0, 0, (StringPtr)fieldname, teh);
  108.         
  109.         TEDispose(teh);
  110.         teh = 0;
  111.         
  112.         start = nstart;
  113.     }
  114.  
  115. out:
  116.     if(sh)
  117.         DisposMyStyleHandle(sh);
  118.     if(teh)
  119.         TEDispose(teh);
  120.     if(txt)
  121.         DisposHandle(txt);
  122.     if(goterror && paramPtr->returnValue == 0)
  123.         paramPtr->returnValue = HStr("error : out of memory!");
  124.     RestoreA4();
  125. }
  126.  
  127. Handle
  128. HStr(str)
  129. char *str;
  130. {
  131.     Handle newHndl;
  132.     
  133.     newHndl = (Handle) NewHandle((long) strlen(str) + 1);
  134.     if(newHndl == 0)
  135.         return(0);
  136.     strcpy((char *) (*newHndl), str);
  137.     return(newHndl);
  138. }
  139.  
  140. void
  141. error(s)
  142. char *s;
  143. {
  144.     if(goterror == 0)
  145.         xptr->returnValue = HStr(s);
  146.     goterror = 1;
  147. }